/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: recv1.c
> Author:cjy
> Mail: 
> Created Time: 2024年08月05日 星期一 15时50分38秒
***************************************************/
#include <stdio.h>       // 标准输入输出头文件
#include <string.h>      // 字符串操作头文件
#include <stdlib.h>      // 标准库头文件
#include <sys/ipc.h>     // 进程间通信头文件
#include <sys/msg.h>     // 消息队列头文件
struct msgbuf{
	long mtype;   //消息类型
	char mtext[100]; 
};
typedef struct use{
	char name[10];
	int age;
	float score;
	struct use *next;
}STU;

int main(int argc,const char* argv[])
{
	char path[50] = {0};
	key_t key = 0;//消息队列标识符
	int msgid = 0;//消息队列 ID
	int ret = 0; // 函数返回值
	printf("请输入路径:");
	scanf("%s",path);
	
	key = ftok(path,1);// 使用 ftok 生成一个唯一的 key
	if (key == -1){
		perror("ftok");
		exit(-1);	
	}
	
	msgid = msgget(key,IPC_CREAT | 0666); // 创建或获取消息队列
	if (msgid == -1){
		perror("msgget");
		exit(-1);	
	}

	struct msgbuf data;
	memset(&data, 0, sizeof(struct msgbuf));
	
	// 接收一条消息
	while(1){
        ret = msgrcv(msgid, &data, sizeof(struct msgbuf) - sizeof(long), 1, 0);
        if (ret == -1) {
        	perror("msgrcv");  // 输出错误信息
        	exit(-1);          // 遇到错误退出程序
    	}
	if (strcmp(data.mtext,"EOF") == 0){
	break;
	}
	STU k;
	memcpy(&k,data.mtext,sizeof(STU));
	printf("age is %d\n",k.age);
    	printf("score is %f\n",k.score);
	printf("name is %s\n",k.name);
	}
	
	printf("ok");
	struct msgbuf msg;
	memset(&msg,0,sizeof(struct msgbuf));
	msg.mtype = 2;
	strcpy(msg.mtext,"传输成功");

	ret = msgsnd(msgid,&msg,sizeof(struct msgbuf) - sizeof(long),0);
	if(ret == -1)
	{
		perror("msgsnd");
		exit(-1);
	}
	// 删除消息队列
        ret = msgctl(msgid, IPC_RMID, NULL);
        if (ret == -1) {
        	perror("msgctl");  // 输出错误信息
        	exit(-1);          // 遇到错误退出程序
    	}
    return 0;
}
